Cloudflareを経由しない直アクセスの禁止を、変換ルールとオリジンのWebサーバ設定で実施してみた
AWSのVPS(Amazon Lightsail)を Webサーバ、Cloudflareを CDN,WAF として利用する環境で、 LightsailのWebサーバに対する直接アクセスを抑制するため、
- Cloudflareの 変換ルール(Transform Rules) を利用して、認証用のリクエストヘッダを追加
- LightsailのWebサーバで認証用のヘッダーの判定を行い、Cloudflare 経由のアクセスのみを許可
とした設定を試す機会がありましたので、紹介させて頂きます。
イメージ図
Cloudflare設定
リクエストヘッダーを修正する変換ルールを作成しました。
※無料プランでも、10個までのルールは作成可能です。
保護対象のホスト名に一致した場合、固定のカスタムヘッダをリクエストヘッダとして追加する設定としました。
- スタティック設定
- ヘッダー名: x-hogehoge
- 値: fugafuga
※カスタムヘッダーは「x−」で始まる認証用と解りやすいもの。値は推測されにくい、十分強度を持った文字列でご利用ください。
Lightsail設定
Lightsailの OSは AmazonLinux 2023。
httpd(Apache)、nginx は デフォルトのリポジトリよりインストールしたものを利用しました。
- httpd-2.4.58-1.amzn2023.x86_64
- nginx-1:1.24.0-1.amzn2023.0.2.x86_64
httpd
指定した文字列がリクエストヘッダに定義されている場合、アクセスを許可する設定としました。
- /etc/httpd/conf/httpd.conf
<Directory "/var/www/html"> SetEnvIf x-hogehoge fugafuga ACCESS_OK Require all denied Require env ACCESS_OK </Directory>
nginx
指定した文字列がセットされていない場合、アクセス禁止、403 応答を戻す設定としました。
- /etc/nginx/nginx.conf
server { listen 80; server_name _; root /usr/share/nginx/html; include /etc/nginx/default.d/*.conf; if ( $http_x_hogehoge != 'fugafuga') { return 403; } }
動作確認
Lightsail
LightsailのIPアドレスを直接指定したアクセスを試み、403応答が戻る事を確認しました。
httpd
$ curl http://3.**.**.**/index.html -v (略) < HTTP/1.1 403 Forbidden < Date: Sun, 17 Mar 2024 14:51:19 GMT < Server: Apache/2.4.58 (Amazon Linux) < Content-Length: 199 < Content-Type: text/html; charset=iso-8859-1
nginx
$ curl http://3.**.**.**/index.html -v (略) < HTTP/1.1 403 Forbidden < Server: nginx/1.24.0 < Date: Sun, 17 Mar 2024 14:53:15 GMT < Content-Type: text/html < Content-Length: 153 < Connection: keep-alive
Cloudflare経由
$ curl http://cloudflare.example.com/index.html -v < HTTP/1.1 200 OK < Date: Sun, 17 Mar 2024 14:53:56 GMT < Content-Type: text/html < Transfer-Encoding: chunked < Connection: keep-alive (略) < Server: cloudflare < CF-RAY: 865dd0baefe907ad-HKG < alt-svc: h3=":443"; ma=86400
カスタムヘッダ付与
認証用のカスタムヘッダーを付与することで、IP直アクセスは可能になります。
$ curl -H 'x-hogehoge:fugafuga' http://3.**.**.**/index.html -v (略) < HTTP/1.1 200 OK < Server: nginx/1.24.0 < Date: Sun, 17 Mar 2024 14:54:21 GMT < Content-Type: text/html < Content-Length: 615
まとめ
CDNで付与した認証用のカスタムヘッダーを WebサーバのNginx、httpdで判定を行う事で、オリジンへの直接アクセスを抑制可能です。
一定規模以上のDoS、DDoSでは、SSL/TLSのネゴシエーション負荷がボトルネックとなる事があります。 CDN、オリジン間の通信が平文となるリスクが問題とならない場合には、暫定対策として Cloudflareの SSL/TLS 暗号化モード フレキシブル、オリジンのWebサーバのhttpsは無効化する事もご検討ください。
※ここまでの対策がVPS(Lightsail)で必要となる場合、恒久対策としては、Application Load Balancer(ALB)や、AWS WAF の 利用できるEC2、ECSへの移行もご検討頂くことをおすすめします。